﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades;

namespace AccesoBD
{
    public class Cajas
    {
        public static bool abrirCaja(CajaDiaria c)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;
            try
            {
                trans = conexion.BeginTransaction();
                string comando = "INSERT INTO Caja_Diaria (fecha, horaApertura, montoApertura, legajoEmpleado) "
                                + "VALUES (@fecha,@horaApertura,@montoApertura,@legajo)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", c.Fecha));
                sqlcmd.Parameters.Add(new SqlParameter("@horaApertura", c.HoraApertura));
                sqlcmd.Parameters.Add(new SqlParameter("@montoApertura", c.MontoApertura));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", c.LegajoEmpleado));
                sqlcmd.Transaction = trans;
                int filas = sqlcmd.ExecuteNonQuery();
                if (filas > 0)
                {
                    comando = "SELECT MAX(idCajaDiaria) as id FROM Caja_Diaria";
                    sqlcmd = new SqlCommand(comando, conexion);
                    sqlcmd.Transaction = trans;
                    SqlDataReader dr = sqlcmd.ExecuteReader();
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            c.IdCaja = long.Parse(dr["id"].ToString());
                        }

                    }
                    dr.Close();

                    comando = "UPDATE Caja_Diaria SET estaAbierta = @estaAbierta WHERE (idCajaDiaria = @idCaja)";
                    sqlcmd = new SqlCommand(comando, conexion);
                    sqlcmd.Parameters.Add(new SqlParameter("@idCaja", c.IdCaja));
                    sqlcmd.Parameters.Add(new SqlParameter("@estaAbierta", true));
                    sqlcmd.Transaction = trans;
                    filas = sqlcmd.ExecuteNonQuery();

                    if (filas > 0)
                    {
                        res = true;
                        trans.Commit();
                    }
                }
            }
            catch (Exception ex)
            {
                trans.Rollback();
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }
        public static long obtenerIdCajaAbierta()
        {
            long id = 0;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT MAX(idCajaDiaria) FROM Caja_Diaria";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                
               
                    id = long.Parse(sqlcmd.ExecuteScalar().ToString());
               
            }
            catch (Exception ex)
            {
                throw;
            }
            return id;
        }
        public static void cerrarCaja(CajaDiaria caja)
        {
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "UPDATE Caja_Diaria SET horaCierre = @horaCierre, montoCierre = @montoCierre, estaAbierta = 0 "
                                + "WHERE (idCajaDiaria = @idCaja)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@horaCierre", caja.HoraCierre));
                sqlcmd.Parameters.Add(new SqlParameter("@montoCierre", caja.MontoCierre));
                sqlcmd.Parameters.Add(new SqlParameter("@idCaja", caja.IdCaja));
                sqlcmd.ExecuteNonQuery();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
        }

        public static bool registrarDetalleEnCaja(DetalleCajaDiaria dc)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "INSERT INTO Detalle_CajaDiaria (idCaja, idTipoMovimiento, monto, observaciones, nroSerie, nroRecibo, idPago, idPagoMedico) "
                                + "VALUES (@idCaja,@idTipoMov,@monto,@obs,@nroSerie,@nroRecibo,@idPago,@idPagoMed)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idCaja", dc.IdCaja));
                sqlcmd.Parameters.Add(new SqlParameter("@idTipoMov", dc.IdTipoMovimiento));
                sqlcmd.Parameters.Add(new SqlParameter("@monto", dc.Monto));
                sqlcmd.Parameters.Add(new SqlParameter("@obs", dc.Observaciones));
                if(dc.NroSerieRecibo == null)
                    sqlcmd.Parameters.Add(new SqlParameter("@nroSerie", DBNull.Value));
                else
                    sqlcmd.Parameters.Add(new SqlParameter("@nroSerie", dc.NroSerieRecibo));
                if(dc.NroRecibo == null)
                    sqlcmd.Parameters.Add(new SqlParameter("@nroRecibo", DBNull.Value));
                else
                    sqlcmd.Parameters.Add(new SqlParameter("@nroRecibo", dc.NroRecibo));
                if (dc.IdPago == null)
                    sqlcmd.Parameters.Add(new SqlParameter("@idPago", DBNull.Value));
                else
                    sqlcmd.Parameters.Add(new SqlParameter("@idPago", dc.IdPago));
                if (dc.IdPagoMedico == null)
                    sqlcmd.Parameters.Add(new SqlParameter("@idPagoMed", DBNull.Value));
                else
                    sqlcmd.Parameters.Add(new SqlParameter("@idPagoMed", dc.IdPagoMedico));
                int filas = sqlcmd.ExecuteNonQuery();
                if (filas > 0)
                    res = true;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }

        public static long obtenerUltimoIDDetalleEnCaja(long p)
        {
            long id = 0;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "select MAX(idDetalleCajaDiaria) from Detalle_CajaDiaria";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                id = long.Parse(sqlcmd.ExecuteScalar().ToString());
                
                
            }
            catch (Exception ex)
            {
                throw;
            }
            return id;
        }

        public static CajaDiaria obtenerCajaCompleta(long p)
        {
            CajaDiaria cd = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Caja_Diaria.idCajaDiaria, Caja_Diaria.fecha, Caja_Diaria.horaApertura, Caja_Diaria.montoApertura, Caja_Diaria.legajoEmpleado, Caja_Diaria.estaAbierta, Detalle_CajaDiaria.idDetalleCajaDiaria, "
                                + "Detalle_CajaDiaria.idCaja, Detalle_CajaDiaria.idTipoMovimiento, Detalle_CajaDiaria.monto, Detalle_CajaDiaria.observaciones "
                                + "FROM Caja_Diaria LEFT JOIN Detalle_CajaDiaria ON Caja_Diaria.idCajaDiaria = Detalle_CajaDiaria.idCaja "
                                + "WHERE (Caja_Diaria.idCajaDiaria = @id)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@id", p));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    cd = new CajaDiaria();
                    cd.DetallesCajaDiaria = new List<DetalleCajaDiaria>();
                    DetalleCajaDiaria objDet = null;
                    while (dr.Read())
                    {
                        cd.IdCaja = long.Parse(dr["idCajaDiaria"].ToString());
                        cd.Fecha = DateTime.Parse(dr["fecha"].ToString());
                        cd.HoraApertura = TimeSpan.Parse(dr["horaApertura"].ToString());
                        cd.MontoApertura = float.Parse(dr["montoApertura"].ToString());
                        cd.LegajoEmpleado = long.Parse(dr["legajoEmpleado"].ToString());
                        cd.EstaAbierta = true;

                        if (dr["idDetalleCajaDiaria"] != DBNull.Value)
                        {
                            objDet = new DetalleCajaDiaria();
                            objDet.IdDetalleCajaDiaria = long.Parse(dr["idDetalleCajaDiaria"].ToString());
                            objDet.IdCaja = long.Parse(dr["idCajaDiaria"].ToString());
                            objDet.Monto = float.Parse(dr["monto"].ToString());
                            objDet.Observaciones = dr["observaciones"].ToString();
                            objDet.IdTipoMovimiento = int.Parse(dr["idTipoMovimiento"].ToString());

                            cd.DetallesCajaDiaria.Add(objDet);
                            objDet = null;
                        }

                    }
                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return cd;
        }
    }
}
